package com.gitee.somenvm.ninerpgitem.core.item

import com.gitee.somenvm.ninerpgitem.api.event.item.ItemUpdateEvent
import com.gitee.somenvm.ninerpgitem.core.kether.namespaces
import com.gitee.somenvm.ninerpgitem.core.resolver.Context
import com.gitee.somenvm.ninerpgitem.core.resolver.StringListParser
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.meta.ItemMeta
import taboolib.common.platform.function.adaptPlayer
import taboolib.library.configuration.ConfigurationSection
import taboolib.module.kether.ScriptOptions
import taboolib.module.nms.getItemTag
import taboolib.platform.util.modifyMeta

/**
 * 不要乱用，会触发 DataInitEvent
 */
fun ItemStack.getNineData(player: Player): NineData {
    val nine = ItemLoader[getID()] ?: return NineData()
    return getNineData(nine, player)
}

/**
 * 不要乱用，会触发 DataInitEvent
 */
fun ItemStack.getNineData(nine: NineItem, player: Player): NineData {
    val sop = ScriptOptions(namespace = namespaces, sender = adaptPlayer(player))
    sop.vars.map["@NBT"] = getItemTag()

    return nine.initData(sop)
}

fun ItemStack.getID(): String {
    return getItemTag().getDeep("NRI.ID")?.asString() ?: "-"
}

/**
 * 更新物品
 */
fun ItemStack.update(data: NineData, nine: NineItem, player: Player, func: (ItemStack) -> Unit): ItemStack {
    val ctx = Context(player, data, this, nine)

    if (!ItemUpdateEvent(ctx).call()) return this

    also(func).modifyMeta<ItemMeta> {
        setDisplayName(StringListParser.parseString(displayName, ctx)[0])
        lore = mutableListOf<String>().apply {
            StringListParser.parse(this, ctx)
        }
    }
    return this
}

/**
 * 实在找不到Data用这个，但是会触发 DataInitEvent
 */
fun ItemStack.update(nine: NineItem, player: Player, func: (ItemStack) -> Unit): ItemStack {
    return update(getNineData(player), nine, player, func)
}


/**
 * 随便找个物品更新,如果你只有物品的话
 */
fun ItemStack.update(player: Player, func: (ItemStack) -> Unit): ItemStack {
    val nine = ItemLoader[getID()] ?: return this
    update(nine, player, func)
    return this
}

fun ConfigurationSection.toMap1(): Map<String, Any?> {
    val map = mutableMapOf<String, Any?>()

    for (key in this.getKeys(false)) { // 使用 getKeys(false) 遍历当前层级的键
        when (val value = this[key]) {
            is ConfigurationSection -> {
                // 如果值是另一个 ConfigurationSection，则递归调用 toMap()
                map[key] = value.toMap()
            }

            is List<*> -> {
                // 处理列表类型的值，这里简单地将列表转换为 Any 类型的列表
                map[key] = value.map { it as Any }
            }

            else -> {
                // 对于基本类型或其他非 ConfigurationSection 的值，直接放入 map
                map[key] = value
            }
        }
    }

    return map
}